﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
//struct Point
//{
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	//大括号可用于所有的内置类型和用户自定义类型的初始化
//	//使用大括号可不加等号（=）
//	//这里强调的是一切皆可使用{}(用于初始化数据的大括号叫做初始化列表)
//	int a = 0;
//	int b = { 1 };
//	int c{ 2 };
//
//	int arr[]{ 1,2,3 };
//
//	Point p{ 1, 2 };
//	int* pa = new int[4]{ 0 };
//
//	//下面是C++模板开始支持的,有了模板之后C++支持了构造和拷贝构造
//	int d(1);
//	int e = int(2);
//
//	return 0;
//}
////总：{}(初始化列表)可用于一切初始化，包括调用自定义类型的构造函数初始化


////返回右值
//int func1()
//{
//	static int x = 5;
//	return x;
//}//func1的返回类型是int，它是一个值类型。因此，func1 返回的是其静态局部变量 x 的一个临时拷贝
////临时拷贝是一个值，属于右值
//
////返回左值
//int& func2()
//{
//	static int x = 5;
//	return x;
//}//func2的返回类型是int&，它是一个引用类型。func2 返回的是对静态局部变量 x 的一个引用
////表示对象x，是一个左值
//
//int main()
//{
//	double x = 1.1, y = 2.2;
//
//	//以下几个都是常见的右值
//	10;
//	x + y;
//	func1();
//
//	//以下几个都是对右值的右值引用
//	int&& rr1 = 10;
//	double&& rr2 = x + y;
//	double&& rr3 = func1();
//	//编译报错: 非常量引用的初始值必须为左值
//	/*int& rr1 = 10;
//	double& rr2 = x + y;
//	double& rr3 = func1();*/
//
//	//编译报错：表达式必须是可修改的左值或函数指示符
//	/*10 = 1;
//	x + y = 1;
//	func1() = 1;
//	&10;
//	&(x + y);
//	&func1();*/
//
//	return 0;
//}

//#include <iostream>
//#include <vector>
//#include <initializer_list>
//using namespace std;
//int main()
//{
//	auto il1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//	initializer_list<int> il2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//	cout << sizeof(il1) << endl; //输出8，没有存储初始化列表数据的空间
//	cout << sizeof(il2) << endl; //输出8，没有存储初始化列表数据的空间
//
//	vector<int> v1 = { 1,2,3,4,5,6,7,8,9 }; //调用内部initializer_list
//	for (auto e : v1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	v1 = { 10, 20,30,40,50 }; //调用内部initializer_list
//	for (auto e : v1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}